import { RSA } from "./encrypt/rsa";

/**
 * RSA加密通信最佳实践示例
 *
 * 本示例展示了如何使用RSA库进行安全通信，包括:
 * 1. 密钥生成
 * 2. 密钥导出/导入
 * 3. 加密/解密
 * 4. 处理超长文本
 * 5. 安全注意事项
 */

// 1. 密钥生成
function generateKeys() {
  console.log("===== 密钥生成 =====");

  // 创建RSA实例并生成2048位密钥对
  const aliceRsa = new RSA();
  aliceRsa.generateKeyPair(2048);

  // 获取Alice的公钥和私钥
  const alicePublicKey = aliceRsa.getPublicKey();
  const alicePrivateKey = aliceRsa.getPrivateKey();

  console.log("Alice的公钥:", alicePublicKey);
  console.log("Alice的私钥:", alicePrivateKey);

  return { aliceRsa, alicePublicKey, alicePrivateKey };
}

// 2. 密钥导入与加密
function encryptMessage(
  publicKey: ReturnType<typeof generateKeys>["alicePublicKey"],
  message: string
) {
  console.log("\n===== 加密消息 =====");

  // Bob创建RSA实例并导入Alice的公钥
  const bobRsa = new RSA();
  if (!publicKey || publicKey.n === null || publicKey.e === null) {
    throw new Error("公钥无效或缺失必要参数");
  }
  bobRsa.setPublicKey(publicKey.n, publicKey.e);

  console.log("原始消息:", message);

  // 加密消息
  const encryptedMessage = bobRsa.encrypt(message);
  console.log("加密后的消息:", encryptedMessage);

  // 加密为Base64格式
  const encryptedBase64 = bobRsa.encryptToBase64(message);
  console.log("Base64加密后的消息:", encryptedBase64);

  return { encryptedMessage, encryptedBase64 };
}

// 3. 解密消息
function decryptMessage(
  privateKey: ReturnType<typeof generateKeys>["alicePrivateKey"],
  encryptedMessage: string,
  encryptedBase64: string
) {
  console.log("\n===== 解密消息 =====");

  // Alice创建RSA实例并导入自己的私钥
  const aliceRsa = new RSA();
  if (!privateKey || privateKey.n === null || privateKey.e === null) {
    throw new Error("公钥无效或缺失必要参数");
  }
  aliceRsa.setPrivateKey(privateKey.n, privateKey.e, privateKey.d);

  // 解密消息
  const decryptedMessage = aliceRsa.decrypt(encryptedMessage);
  console.log("解密后的消息:", decryptedMessage);

  // 从Base64解密
  const decryptedFromBase64 = aliceRsa.decryptFromBase64(encryptedBase64);
  console.log("从Base64解密后的消息:", decryptedFromBase64);

  return { decryptedMessage, decryptedFromBase64 };
}

// 4. 处理超长文本
function handleLongText(
  publicKey: ReturnType<typeof generateKeys>["alicePublicKey"]
) {
  console.log("\n===== 处理超长文本 =====");

  // 创建一个很长的消息
  const longMessage =
    "这是一段非常长的文本，用于测试RSA对超长字符串的支持。" +
    "RSA算法本身有明文长度限制，通常是密钥长度/8 - 11字节。" +
    "对于2048位密钥，这意味着大约245字节的限制。" +
    "我们的实现通过分块加密技术解决了这个问题，使得可以处理任意长度的文本。" +
    "这对于实际应用中的安全通信非常重要，因为消息长度往往不受限制。" +
    "这个示例展示了如何安全地加密和解密长文本，确保通信的机密性和完整性。" +
    "RSA加密算法是现代密码学的基石之一，广泛应用于数字签名、密钥交换和安全通信等领域。";

  console.log("长消息长度:", longMessage.length, "字符");

  // Bob使用Alice的公钥加密长消息
  const bobRsa = new RSA();
  if (!publicKey || publicKey.n === null || publicKey.e === null) {
    throw new Error("公钥无效或缺失必要参数");
  }
  bobRsa.setPublicKey(publicKey.n, publicKey.e);

  const encryptedLongMessage = bobRsa.encrypt(longMessage);
  console.log("加密后的长消息:", encryptedLongMessage);

  return { longMessage, encryptedLongMessage };
}

// 5. 验证超长文本的解密
function verifyLongTextDecryption(
  privateKey: ReturnType<typeof generateKeys>["alicePrivateKey"],
  longMessage: string,
  encryptedLongMessage: string
) {
  console.log("\n===== 验证超长文本解密 =====");

  // Alice使用自己的私钥解密长消息
  const aliceRsa = new RSA();
  if (!privateKey || privateKey.n === null || privateKey.e === null) {
    throw new Error("公钥无效或缺失必要参数");
  }
  aliceRsa.setPrivateKey(privateKey.n, privateKey.e, privateKey.d);

  const decryptedLongMessage = aliceRsa.decrypt(encryptedLongMessage);
  console.log("解密后的长消息长度:", decryptedLongMessage.length, "字符");

  // 验证解密是否正确
  const isCorrect = decryptedLongMessage === longMessage;
  console.log("解密是否正确:", isCorrect);

  return isCorrect;
}

// 6. 安全注意事项演示
function securityBestPractices() {
  console.log("\n===== 安全注意事项 =====");

  // 演示密钥长度的重要性
  console.log("密钥长度的重要性:");
  console.log("- 1024位密钥: 计算能力增强后已不安全，建议至少使用2048位");
  console.log("- 2048位密钥: 当前推荐的最低安全级别");
  console.log("- 4096位密钥: 更高安全性，但计算成本更高");

  // 演示密钥管理的重要性
  console.log("\n密钥管理的最佳实践:");
  console.log("- 私钥必须安全存储，不应在不安全的环境中传输");
  console.log("- 公钥可以公开分发，但应通过可信渠道获取");
  console.log("- 定期轮换密钥，特别是在安全事件后");

  // 演示RSA的局限性
  console.log("\nRSA的局限性:");
  console.log("- 仅适用于加密小数据块，不适合加密大量数据");
  console.log("- 计算开销大，不适合频繁加密操作");
  console.log("- 建议与对称加密算法结合使用，如AES");
}

// 7. 完整通信流程
function completeCommunicationFlow() {
  console.log("\n===== 完整通信流程 =====");

  // 1. 生成密钥对
  const { aliceRsa, alicePublicKey, alicePrivateKey } = generateKeys();

  // 2. 准备消息
  const message = "你好，Alice！这是Bob发来的加密消息。";

  // 3. Bob加密消息
  const { encryptedMessage, encryptedBase64 } = encryptMessage(
    alicePublicKey,
    message
  );

  // 4. Alice解密消息
  const { decryptedMessage, decryptedFromBase64 } = decryptMessage(
    alicePrivateKey,
    encryptedMessage,
    encryptedBase64
  );

  // 5. 验证消息
  const isMessageCorrect =
    decryptedMessage === message && decryptedFromBase64 === message;
  console.log("\n通信验证:", isMessageCorrect ? "成功" : "失败");

  // 6. 处理长文本
  const { longMessage, encryptedLongMessage } = handleLongText(alicePublicKey);
  const isLongTextCorrect = verifyLongTextDecryption(
    alicePrivateKey,
    longMessage,
    encryptedLongMessage
  );

  console.log("\n长文本处理验证:", isLongTextCorrect ? "成功" : "失败");

  // 7. 安全注意事项
  securityBestPractices();
}

// 执行完整通信流程
completeCommunicationFlow();
function App() {
  return <div className="app-container">123</div>;
}

export default App;